#ifndef REMOTE_COMMON_H
#define REMOTE_COMMON_H

#include <iostream>
#include <cstring>
#include <vector>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

// 配置参数
const int PORT_CONTROL = 5500;          // 通信端口
const int PORT_SCREEN = 6600;           // 屏幕端口
const int PIXEL_BYTES = 3;              // 每个像素的字节数(RGB)
const int SCREEN_WIDTH = 1920;          // 屏幕宽度(实际运行时会由服务端获取)
const int SCREEN_HEIGHT = 1080;         // 屏幕高度(实际运行时会由服务端获取)
const int BUFFER_SIZE = 4096;           // 网络缓冲区大小

// 数据包类型
enum PacketType {
    SCREEN_DATA,    // 屏幕图像数据
    MOUSE_EVENT,    // 鼠标事件
    KEYBOARD_EVENT, // 键盘事件
    CONFIG_DATA,    // 配置数据，初建立连接时双方协商同步的一些配置
};

// 数据包头部
struct PacketHeader {
    PacketType type;       // 数据包类型
    size_t data_size;      // 数据部分大小
};

// 主控端和被控端初步建立连接后，双方协商的配置数据
struct ConfigData {
    int scaled_screen_width;
    int scaled_screen_height;
};

// 鼠标事件结构
struct MouseEvent {
    int x;                // X坐标
    int y;                // Y坐标
    bool left_down;       // 左键是否按下
    bool right_down;      // 右键是否按下
    int wheel_delta;      // 滚轮 delta 值（+120=上滚，-120=下滚）
    bool dragging;        // 是否处于拖拽状态（左键按下并移动）
};

// 键盘事件结构
struct KeyboardEvent {
    uint16_t keycode;     // 键码(X11标准)
    bool pressed;         // 是否按下
};

// 创建TCP套接字
static int create_tcp_socket() {
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("创建套接字失败");
    }
    return sockfd;
}

// 完整发送数据
static bool send_all(int sockfd, const void* data, size_t len) {
    const char* buffer = static_cast<const char*>(data);
    size_t total_sent = 0;
    
    while (total_sent < len) {
        ssize_t sent = send(sockfd, buffer + total_sent, len - total_sent, 0);
        if (sent < 0) {
            perror("发送数据失败");
            return false;
        }
        total_sent += sent;
    }
    
    return true;
}

// 完整接收数据
static bool recv_all(int sockfd, void* data, size_t len) {
    char* buffer = static_cast<char*>(data);
    size_t total_recv = 0;
    
    while (total_recv < len) {
        ssize_t received = recv(sockfd, buffer + total_recv, len - total_recv, 0);
        if (received <= 0) {
            if (received < 0) perror("接收数据失败");
            return false;
        }
        total_recv += received;
    }
    
    return true;
}

#endif // REMOTE_COMMON_H

